package models

import (
	"github.com/astaxie/beego/orm"
	"github.com/beego/beego/v2/core/logs"
	"time"
)

// SysUser 用户表
type SysUser struct {
	Id         int64        `orm:"pk;auto;column(id);description(主键ID)"`
	Username   string       `orm:"size(32);column(username);description(用户名)"`
	Password   string       `orm:"size(64);column(password);default();description(用户密码)"`
	Profile    *UserProfile `orm:"rel(one);description(对应user_profile表ID)"` // OneToOne relation
	CreateTime time.Time    `orm:"auto_now_add;type(datetime);column(create_time);description(创建时间)"`
	UpdateTime time.Time    `orm:"null;type(datetime);column(update_time);description(更新时间)"`
}

// 定义所需的列名
func getSysUserNeededColumns() []string {
	return []string{"Id", "Username", "Profile", "CreateTime", "UpdateTime"}
}

// TableName 设置表名
func (u *SysUser) TableName() string {
	return "sys_user"
}

// TableIndex 多字段索引
func (u *SysUser) TableIndex() [][]string {
	return [][]string{
		//{"字段1", "字段2"},
	}
}

// TableUnique 多字段唯一键
func (u *SysUser) TableUnique() [][]string {
	return [][]string{
		{"Username"},
	}
}

// TableEngine 设置引擎为 INNODB
func (u *SysUser) TableEngine() string {
	return "INNODB"
}

// 让其自身具备增删改查的功能

// AddSysUser 新增SysUser返回新增的对象ID
func AddSysUser(user SysUser) int64 {
	o := orm.NewOrm()
	user.Profile = &UserProfile{}
	id, err := o.Insert(&user)
	if err != nil {
		logs.Error("插入数据异常：", err)
		return 0
	}
	return id
}

// RemoveSysUser 新增SysUser 成功返回1 失败返回0
func RemoveSysUser(id int) int64 {
	o := orm.NewOrm()
	user := SysUser{Id: int64(id)}
	i, err := o.Delete(&user)
	if err != nil {
		logs.Error("删除数据异常：", err)
		return 0
	}
	return i
}

// UpdateSysUser 修改SysUser 成功返回更新后的对象 失败返回nil
func UpdateSysUser(user SysUser) *SysUser {
	if user.Profile == nil {
		user.Profile = &UserProfile{}
	}
	user.UpdateTime = time.Now()
	o := orm.NewOrm()
	i, err := o.Update(&user)
	if i < 0 && err != nil {
		logs.Error("删除数据异常：", err)
		return nil
	}
	retUser, err := GetSysUserById(int(user.Id))
	if err != nil {
		logs.Error("查询对象异常：", err)
		return nil
	}
	return retUser
}

// GetSysUserById 根据主键查询用户信息
func GetSysUserById(id int) (*SysUser, error) {
	o := orm.NewOrm()
	user := new(SysUser)
	//_, err := o.QueryTable("sys_user").Filter("Id", id).All(user)
	err := o.QueryTable("sys_user").Filter("Id", id).One(user, getSysUserNeededColumns()...)
	//err:=o.Raw("select * from user where Id = ?",id).QueryRow(user)//使用sql语句进行查询
	if err != nil {
		logs.Error(err)
		return nil, err
	}
	return user, nil
}

// GetSysUserList 查询所有用户
func GetSysUserList() ([]*SysUser, error) {
	o := orm.NewOrm()
	var users []*SysUser
	_, err := o.QueryTable("sys_user").All(&users, getSysUserNeededColumns()...)
	//err:=o.Raw("select * from user where Id = ?",id).QueryRow(user)//使用sql语句进行查询
	if err != nil {
		logs.Error(err)
		return nil, err
	}
	return users, nil
}

func init() {
	// 需要在 init 中注册定义的 model
	orm.RegisterModel(new(SysUser))
}
